package com.jsd.openapi.controller;

import com.alibaba.fastjson2.JSONObject;
import com.jsd.openapi.rest.JsdRestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 代付相关接口
 *
 * @author xm
 * @date 2024/1/21
 **/
@RestController
public class DfController {
    @Autowired
    private JsdRestUtil jsdRestUtil;
    private final static String version = "/v1";

    @Value("${jsd.mc_no}")
    public String mc_no;
    @Value("${jsd.df_callback}")
    public String df_callback;
    @Value("${jsd.recharge_callback}")
    public String recharge_callback;

    /**
     * 创建代付任务订单
     *
     * @return
     */
    @GetMapping("create")
    public Object create() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("orderType", "2"); // 1=到户，2=到卡
        requestMap.put("remark", "测试发薪任务");
        requestMap.put("notifyUrl", df_callback);
        List<JSONObject> dfOrders = new ArrayList<>();
        JSONObject params = new JSONObject();
        params.put("orderNo", "B202401230000001");
        params.put("payeeAccount", "810100501421025299");
        params.put("payeeName", "山东宇燕数据科技有限公司");
        params.put("amount", "0.1");
        params.put("orderTitle", "测试");
        params.put("accountType", "2"); // 1=对私，2-对公
        params.put("instName", "日照银行"); // 值来源请前往开放平台文档-资料文档下载js文件
        params.put("bankCode", "313473200167");
        dfOrders.add(params);
        requestMap.put("dfOrders", JSONObject.toJSONString(dfOrders));
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/create");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 开始发薪
     *
     * @return
     */
    @GetMapping("start")
    public Object start() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("tradeBatchNo", "DFB202411070073300003");
        requestMap.put("bookNo", "AB202410219624800001");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/start");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 查询任务详情
     *
     * @return
     */
    @GetMapping("query")
    public Object query() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("tradeBatchNo", "DFB202411117008200001");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/query");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 查询子单详情
     *
     * @return
     */
    @GetMapping("query_single")
    public Object query_single() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("tradeOrderNo", "DF202411112707100001");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/query_single");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 取消任务
     *
     * @return
     */
    @GetMapping("cancel")
    public Object cancel() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("tradeBatchNo", "DFB202411110931400003");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/cancel");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 取消单个子单
     *
     * @return
     */
    @GetMapping("cancel_single")
    public Object cancel_single() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "A202401230000001");
        requestMap.put("tradeOrderNo", "DF202411119942900004");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/cancel_single");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }


    /**
     * 查询商户的记账本
     *
     * @return
     */
    @GetMapping("book_query")
    public Object book_query() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/book_query");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 记账本充值
     *
     * @return
     */
    @GetMapping("book_recharge")
    public Object book_recharge() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("bookNo", "AB202410219624800001");
        requestMap.put("amount", "0.1");
        requestMap.put("orderTitle", "测试余额充值");
        requestMap.put("notifyUrl", recharge_callback);
        requestMap.put("remark", "测试备注");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/book_recharge");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 记账本充值查询
     *
     * @return
     */
    @GetMapping("book_recharge_query")
    public Object book_recharge_query() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("tradeOrderNo", "ABR202410284863100008");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/book_recharge_query");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 记账本余额流水明细查询
     *
     * @return
     */
    @GetMapping("book_log_query")
    public Object book_log_query() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("bookNo", "AB202410219624800001");
        requestMap.put("pageNo", "1");
        requestMap.put("pageSize", "10");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/book_log_query");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 下载回单
     *
     * @return
     */
    @GetMapping("bill_download")
    public Object bill_download() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "B202401230000001");
        requestMap.put("tradeOrderNo", "DF202410294059000001");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/bill_download");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 账户检测
     *
     * @return
     */
    @GetMapping("account_check")
    public Object account_check() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "B202401230000001");
        requestMap.put("account", "xxxx");
        requestMap.put("accountType", "1");
        try {
            JSONObject jsonObject = jsdRestUtil.post(requestMap, version + "/df_order/account_check");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}
